if (!dojo._hasResource["dojo.dnd.Avatar"]) { //_hasResource checks added by build. Do not use _hasResource directly in your code.
    dojo._hasResource["dojo.dnd.Avatar"] = true;
    dojo.provide("dojo.dnd.Avatar");

    dojo.require("dojo.dnd.common");

    dojo.declare("dojo.dnd.Avatar", null, {
        // summary: an object, which represents transferred DnD items visually
        // manager: Object: a DnD manager object

        constructor: function(manager) {
            this.manager = manager;
            this.construct();
        },

        // methods
        construct: function() {
            // summary: a constructor function;
            //	it is separate so it can be (dynamically) overwritten in case of need
            var a = dojo.doc.createElement("table");
            a.className = "dojoDndAvatar";
            a.style.position = "absolute";
            a.style.zIndex = 1999;
            a.style.margin = "0px"; // to avoid dojo.marginBox() problems with table's margins
            var b = dojo.doc.createElement("tbody");
            var tr = dojo.doc.createElement("tr");
            tr.className = "dojoDndAvatarHeader";
            var td = dojo.doc.createElement("td");
            td.innerHTML = this._generateText();
            tr.appendChild(td);
            dojo.style(tr, "opacity", 0.9);
            b.appendChild(tr);
            var k = Math.min(5, this.manager.nodes.length);
            var source = this.manager.source;
            for (var i = 0; i < k; ++i) {
                tr = dojo.doc.createElement("tr");
                tr.className = "dojoDndAvatarItem";
                td = dojo.doc.createElement("td");
                if (source.creator) {
                    // create an avatar representation of the node
                    node =
                    source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node;
                } else {
                    // or just clone the node and hope it works
                    node = this.manager.nodes[i].cloneNode(true);
                    if (node.tagName.toLowerCase() == "tr") {
                        // insert extra table nodes
                        var table = dojo.doc.createElement("table"),
                                tbody = dojo.doc.createElement("tbody");
                        tbody.appendChild(node);
                        table.appendChild(tbody);
                        node = table;
                    }
                }
                node.id = "";
                td.appendChild(node);
                tr.appendChild(td);
                dojo.style(tr, "opacity", (9 - i) / 10);
                b.appendChild(tr);
            }
            a.appendChild(b);
            this.node = a;
        },
        destroy: function() {
            // summary: a desctructor for the avatar, called to remove all references so it can be garbage-collected
            dojo._destroyElement(this.node);
            this.node = false;
        },
        update: function() {
            // summary: updates the avatar to reflect the current DnD state
            dojo[(this.manager.canDropFlag ? "add" : "remove") +
                 "Class"](this.node, "dojoDndAvatarCanDrop");
            // replace text
            dojo.query("tr.dojoDndAvatarHeader td").forEach(function(node) {
                node.innerHTML = this._generateText();
            }, this);
        },
        _generateText: function() {
            // summary: generates a proper text to reflect copying or moving of items
            return this.manager.nodes.length.toString();
        }
    });

}
